package com.atguigu.srb.core.controller.admin;


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.atguigu.common.exception.BusinessException;
import com.atguigu.common.results.R;
import com.atguigu.common.results.ResultCodeEnum;
import com.atguigu.srb.core.listener.DictDataListener;
import com.atguigu.srb.core.mapper.DictMapper;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.pojo.excel.DictData;
import com.atguigu.srb.core.service.DictService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.ApiOperation;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 数据字典 前端控制器
 * </p>
 *
 * @author Atguigu
 * @since 2022-10-24
 */
@RestController
@RequestMapping("/admin/core/dict")

public class AdminDictController {
    @Autowired
    DictService dictService;
    @Autowired
    DictMapper dictMapper;

    @ApiOperation("根据id查询数据字典")
    @GetMapping("getById/{id}")
    public R getById(@PathVariable("id")String id){
        Dict dict = dictService.getById(id);
        return R.success().data("item" , dict);
    }
    @ApiOperation("更新数据字典")
    @PutMapping("update")
    //更新数据字典时 使用dict对象的parentId拼接key过期数据
    @CacheEvict(value = "srb:dicts" , key = "{#dict.parentId}")
    public R updateById(@RequestBody Dict dict){
        dictService.updateById(dict);
        return R.success().message("更新成功");
    }
    @ApiOperation("删除数据字典")
    //让删除的数据字典的缓存过期
//    @CacheEvict()
    @DeleteMapping("deleteById/{id}")
    public R deleteById(@PathVariable("id")String id){
        //查询当前要删除的数据的parentid，使用redisTemplate删除缓存(srb:dicts::parentid)
        dictService.removeById(id);
        return R.success().message("删除成功");
    }



    //1、导入excel数据:解析excel数据存入到dict数据库表中
    @ApiOperation(value = "导入excel数据")
    @PostMapping("import")
    // 多部件提交上传的文件    后端接收时需要使用部件的name属性值来绑定接收前端提交的文件
    public R importDicts(@RequestParam("excel") MultipartFile file){ //接收上传的excel文件
        try {
        /*
            1、引入依赖
            2、为要加载的excel文件创建javabean
            3、创建监听器
            4、使用EasyExcel读取数据
         */
            EasyExcel.read(file.getInputStream())
                    .sheet(0)
                    .head(DictData.class)
                    .registerReadListener(new DictDataListener(dictMapper))
                    .doRead();
            return R.success().message("数据字典导入成功");
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(ResultCodeEnum.UPLOAD_ERROR);
        }
    }

    @ApiOperation("导出数据字典")
    @GetMapping("export")
    public void exportDicts(HttpServletResponse response){
        try {
            //1、查询数据字典的数据，转为DictData对象集合
            List<Dict> dicts = dictMapper.selectList(null);
            //Dict的集合 遍历  每个Dict 转为DictData对象
            //stream()  map()-> 可以遍历集合的每个对象 再返回一个对象  最终通过collect 将返回对象封装到一个新的集合中
            List<DictData> dataList = dicts.stream().map(dict -> {
                DictData dictData = new DictData();
                dictData.setId(dict.getId().intValue());
                dictData.setCode(dict.getDictCode());
                dictData.setName(dict.getName());
                dictData.setParentId(dict.getParentId().intValue());
                dictData.setValue(dict.getValue());
                return dictData;
            }).collect(Collectors.toList());
            //2、将集合数据写入到excel文件中交给浏览器
            // response: 代表响应对象，需要交给浏览器的数据存到响应报文中  浏览器获取会自动解析
//        response.getOutputStream() 响应对象输出流可以写数据给浏览器

            //2.1 设置响应头：告诉浏览器响应文件的格式 和文件名称
            //表示响应的是一个附件 文件 浏览器需要下载
            response.setHeader("content-disposition" , "attachment;fileName=dicts"
                   + new DateTime().toString("-yyyy-MM-dd")
                    + ExcelTypeEnum.XLSX.getValue());
            //2.2 将文件的流写入到响应对象中
            EasyExcel.write(response.getOutputStream())
                    .sheet("数据字典")
                    .head(DictData.class)
                    .doWrite(dataList);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    @ApiOperation("根据父节点id查询数据字典")
    @GetMapping("getDictsByPid/{pid}")
    public R getDictsByPid(@PathVariable("pid")String pid){
        List<Dict> dicts = dictService.getDictsByPid(pid);

        return R.success().data("items",dicts);
    }

}

